#include <stdlib.h>
#include <string.h>
#include <stdio.h>

//数组类型基本语法知识梳理
//定义一个数组类型
//int a[10];

//定义一个指针数组类型

//定义一个指向 数组类型的指针
int main01(int argc, char const *argv[])
{
        int a[10]; //a代表的是数组首元素的地址 &a代表整个数组的地址   a+1 4   &a+1步长 40 32位平台下

        {
                //定一个数组类型
                typedef int (arr)[10]; 
                arr myarr;
                myarr[0] = 10;
                printf("%d \n", myarr[0]);
        }
        
        {      
                //定义一个指针数组类型
                typedef int (*parr)[10];
                parr myparr; //sizeof(int)*10
                myparr = &a;   //myparr 整个数组的地址
                //类似于下面
                //int b =10;
                //int *p = NULL;
                //p = &b;
                (*myparr)[0] = 20;
                printf("a[0] = %d \n", a[0]);
        }

        {
                //定义一个指向 数组类型的指针
                int (*mypointer)[10]; //这个是变量 告诉c编译器 给我分配内存
                mypointer = &a;
                (*mypointer)[0] = 40;
                printf("a[0] = %d \n", a[0]);
        }

        return 0;
}

//函数指针基本语法知识梳理
//1 如何定义一个函数类型
//2 如何定义一个函数指针类型
//3 如何定义一个函数指针 （指向一个函数的入口地址）
int add(int a, int b){
        printf("func add ....\n");
        return a+b;
}
int main02(int argc, char const *argv[])
{
        add(1, 2); //直接调用 //函数名就是函数的入口地址

        //定义一个函数类型
        {
                typedef int (MyFuncType)(int a, int b); //定义了一个类型
                MyFuncType *myPointerFunc = NULL; //定义了一个指针,指向某一种类型的函数

                myPointerFunc = &add; //细节
                myPointerFunc(3, 4); //间接调用

                myPointerFunc = &add; //细节
                myPointerFunc(3, 4); //间接调用
                
                myPointerFunc = add; //细节 //c 过程 兼容历史版本的原因
                myPointerFunc(3, 4); //间接调用
        }

        //定义一个函数指针类型
        {
                typedef int (*MyPointerFuncType)(int a, int b);  //int *a = NULL;
                MyPointerFuncType myPointerFunc; //定义一个指针
                myPointerFunc = add;
                myPointerFunc(5, 6);
        }

        //函数指针
        {
                int (*myPointerFunc)(int a, int b); //定义了一个变量
                myPointerFunc = add;
                myPointerFunc(7, 8);
        }

        return 0;
}


